#include "../header/bib_Abrir_Configuracion.h"

static int obtenerConfiguracion(char *cadena, CONFIG_EST *config);	/*Coloca cadena en el miembro correcto de la variable global (lo convierte si es valor numerico)*/
static int ValidaPuerto(int);	/*Valida que el puerto se encuentre en un rango correcto*/

extern char nivelLog;
extern char usarConsola;
extern char usarCache;
extern int grupoEspejo;

int abrirConfiguracion(CONFIG_EST *config){

	char cadenaLeida[TAM_MAX];
	FILE *archivo;
	
	//Establecer configuración por defecto
	config->puertoEntrada=-1;

	nivelLog = ERROR;
	
	if (!(archivo = fopen(ARCHIVO_CONFIGURACION, "r"))){
		imprimirLog(ERROR, "No se pudo abrir el archivo de configuracion", ARCHIVO_CONFIGURACION);
		return FIN_ERROR;
	}
	imprimirLog(DEBUG, "Archivo de configuracion abierto", "");
	
	while (fgets(cadenaLeida, TAM_MAX, archivo))
		if (obtenerConfiguracion(cadenaLeida, config) == FIN_ERROR)
			return FIN_ERROR;
	
	if (fclose(archivo)){
		imprimirLog(WARNING, "No se pudo cerrar el descriptor del archivo de configuracion", "");
		return FIN_WARNING;
	}
	else{
		imprimirLog(DEBUG, "Archivo de configuracion cerrado", "");

		//Verificar si el puerto es válido
		if (config->puertoEntrada==-1){
			//Puerto no válido
			imprimirLog(ERROR, "Falta el puerto en el archivo de configuración.", "");
			return FIN_ERROR;
		}

		return FIN_OK;
	}
}
/*=====================================================================================*/
static int ValidaPuerto(int puerto){

	if (puerto < 0){
		imprimirLogNumerico(ERROR, "Numero de puerto Invalido:", puerto);
		return FIN_ERROR;
	}

	if (puerto < 1024){
		imprimirLog(WARNING, "El numero de puerto debe ser mayor a 1024", "");
		return FIN_WARNING;
	}
	
	return FIN_OK;
}
/*=====================================================================================*/
static int ValidaGrupoEspejo(int valor){

	if (valor < 0){
		imprimirLogNumerico(WARNING, "El valor del grupo de espejo debe ser mayor a 0:", valor);
		grupoEspejo=100;
	}

	return FIN_OK;
}
/*=====================================================================================*/
static int ValidaActConsola(char valor){
	//Validar valor de entrada
	char cadenaAux[2];

	if (valor!='S' && valor!='N'  && valor!='F'){
		cadenaAux[0]=valor;
		cadenaAux[1]='\0';
		imprimirLog(ERROR, "Valor de consola inválido:", cadenaAux);
		return FIN_ERROR;
	}

	return FIN_OK;
}
/*=====================================================================================*/
static int ValidaActCache(char valor){
	//Validar valor de entrada
	char cadenaAux[2];

	if (valor!='S' && valor!='N'){
		cadenaAux[0]=valor;
		cadenaAux[1]='\0';
		imprimirLog(ERROR, "Valor de caché inválido:", cadenaAux);
		return FIN_ERROR;
	}

	return FIN_OK;
}
/*=====================================================================================*/
static int obtenerConfiguracion(char * cadena, CONFIG_EST *config){

	char *ptr, *pszValor;
	char tokens[2 + 1] = "=\n";
	ptr = strtok(cadena, tokens);
	pszValor = strtok(NULL, tokens);
	
	if (!strcmp("NivelLog", ptr)){  /*Debe ser 3 o mas para que muestre todos los tipos de log */
		nivelLog = atoi(pszValor);		
		imprimirLog(INFO, "Nivel del Log:", pszValor);
	}
			
	else if (!strcmp("Puerto", ptr)){
		config->puertoEntrada = atoi(pszValor);
		if (ValidaPuerto(config->puertoEntrada) == FIN_ERROR)
			return FIN_ERROR;
		imprimirLog(INFO, "Puerto de escucha para File System y Planificadores:", pszValor);
	}

	else if (!strcmp("GrupoEspejo", ptr)){
		grupoEspejo = atoi(pszValor);
		if (ValidaGrupoEspejo(grupoEspejo) == FIN_ERROR)
			return FIN_ERROR;
		imprimirLog(INFO, "Grupo de Espejo:", pszValor);
	}
			
	else if (!strcmp("Consola", ptr)){
		usarConsola = toupper(pszValor[0]);
		if (ValidaActConsola(usarConsola) == FIN_ERROR)
			return FIN_ERROR;

		if (usarConsola=='F'){
			imprimirLog(INFO, "Utilizar consola:", "Activado (Completo)");
		}else if (usarConsola=='S'){
			imprimirLog(INFO, "Utilizar consola:", "Activado");
		}else{
			imprimirLog(INFO, "Utilizar consola:", "Desactivado");
		}
	}
	
	else if (!strcmp("Cache", ptr)){
		usarCache = toupper(pszValor[0]);
		if (ValidaActCache(usarCache) == FIN_ERROR)
			return FIN_ERROR;

		if (usarCache=='S'){
			imprimirLog(INFO, "Utilizar cache:", "Activado");
		}else{
			imprimirLog(INFO, "Utilizar cache:", "Desactivado");
		}
	}
	else{
		imprimirLog(WARNING, "Parametro inválido ingresado en la configuracion:", ptr);
		return FIN_WARNING;
	}

	return FIN_OK;
}
